#include "examdialog.h"
#include "QtWidgets/qapplication.h"

#include <QFile>
#include <QMessageBox>
#include <QPushButton>

examdialog::examdialog(QWidget *parent): QDialog(parent){

    // 设置字体大小
    QFont font;
    font.setPointSize(12);
    setFont(font);

    // 设置窗体样式
    setPalette(QPalette(QColor(255, 255, 255)));
    setWindowTitle("考试已用时：0分0秒");
    setWindowFlags(Qt::Dialog | Qt::WindowCloseButtonHint);
    resize(800, 900);

    // 初始化定时器
    initTimer();
    // 初始化布局
    initLayout();
    // 初始化题库
    bool textEditState = initTextEdit();
    if(!textEditState){
        // 初始化失败提示并退出程序
        QMessageBox::information(this, "提示", "初始化题库失败！");
        QTimer::singleShot(0, qApp, SLOT(quit()));
    }
    // 初始化答案选择器
    initButtons();

    // 显示
    show();
}

examdialog::~examdialog(){
}

void examdialog::initTimer(){
    // 重置用时
    m_timeGo = 0;
    // 初始化定时器
    m_timer = new QTimer(this);
    m_timer->setInterval(1000);
    m_timer->start();
    // 连接信号和槽 - 过时
    // connect(m_timer, SIGNAL(timeout()), SLOT(freshTime()));
    // 连接信号和槽 - qt5开始
    connect(m_timer, &QTimer::timeout, this, &examdialog::freshTime);
}

void examdialog::initLayout(){
    m_layout = new QGridLayout(this);
    // 设置控件间的间隔
    m_layout->setSpacing(10);
    // 设置窗体与控件的边距
    m_layout->setContentsMargins(10, 10, 10, 10);
}

bool examdialog::initTextEdit(){
    // 读取文件的行
    QString strLine;
    // 用于读取到的答案行
    QStringList strList;
    // 文件路径
    QString filename("/Users/yuanxulong/longpc/Project/Learn/QT/QtLearn/res/exam.txt");
    // 文件对象，用于打开上面的文件
    QFile file(filename);
    // 获取到的文件流
    QTextStream stream(&file);
    // 进行打开操作
    bool openStatus = file.open(QIODeviceBase::ReadOnly | QIODeviceBase::Text);
    // 打开失败就直接关闭
    if(!openStatus){
        return false;
    }

    // 用于保存显示到文本编辑器的数据
    QString strText;
    // 当前读取到的行数
    int nLines = 0;
    // 处理文本并放到控件上
    while(!stream.atEnd()){
        // 过滤第一行 - 第一行没用
        if(nLines == 0){
            stream.readLine();
            nLines += 1;
            continue;
        }

        // 过滤答案行 - 并存储在内存中 - 最后一题特殊单独拿出来
        if((nLines >= 6 && nLines <= (6 * 9) && nLines % 6 == 0) || (nLines == 6 * 9 + 4)){
            strLine = stream.readLine();
            strList = strLine.split(" ");
            m_answerList.append(strList.at(1));
            strText += "\n";
            nLines += 1;
            continue;
        }

        // 拼接题目文本
        strText += stream.readLine();
        strText += "\n";
        nLines++;
    }
    // 处理完数据，开始显示
    m_textEdit = new QTextEdit();
    m_textEdit->setText(strText);
    m_layout->addWidget(m_textEdit, 0, 0, 1, 10);
    file.close();
    return true;
}

void examdialog::initButtons(){
    // 单选题答案列表
    QStringList strList = {"A", "B", "C", "D"};
    // 总共10道题
    for (int i = 0; i < 10; i++) {
        // 题目标签-第*题
        m_titleLalbels[i] = new QLabel(this);
        m_titleLalbels[i]->setText("第" + QString::number(i+1) + "题");
        m_layout->addWidget(m_titleLalbels[i], 1, i);

        // 多选题
        if(i == 9){
            m_radioA = new QRadioButton(this);
            m_radioB = new QRadioButton(this);

            m_radioA->setText("正确");
            m_radioB->setText("错误");

            m_layout->addWidget(m_radioA, 2, 9);
            m_layout->addWidget(m_radioB, 3, 9);

            // 用于解析选择的答案的
            m_btnGroups[8] = new QButtonGroup(this);
            m_btnGroups[8]->addButton(m_radioA);
            m_btnGroups[8]->addButton(m_radioB);
            break;
        }

        // 选择题
        // 前8道题都是单选题，所以直接在这创建答案集合控件
        if(i < 8){
            m_btnGroups[i] = new QButtonGroup(this);
        }
        for (int j = 0; j < strList.count(); ++j) {
            if(i == 8){
                // 多选
                m_checkBtns[j] = new QCheckBox(this);
                m_checkBtns[j]->setText(strList[j]);
                m_layout->addWidget(m_checkBtns[j], j+2, i);
                continue;
            }
            // 单选
            int index = 4 * i +j;
            m_radioBtns[index] = new QRadioButton(this);
            m_radioBtns[index]->setText(strList.at(j));
            m_layout->addWidget(m_radioBtns[index], j+2, i);

            // 用于解析选择的答案
            m_btnGroups[i]->addButton(m_radioBtns[index]);
        }

        // 提交按钮
        QPushButton *submitBtn = new QPushButton(this);
        submitBtn->setText("提交");
        submitBtn->setFixedSize(100, 35);
        // 事件插槽和信号 - 过时
        // connect(submitBtn,SIGNAL(clicked(bool)),this,SLOT(getScore()));
        // 事件插槽和信号
        connect(submitBtn, &QPushButton::clicked, this, &examdialog::getScore);
        m_layout->addWidget(submitBtn, 5, 9);
    }
}

void examdialog::freshTime(){
    m_timeGo++;
    QString mintues = QString::number(m_timeGo / 60);
    QString second = QString::number(m_timeGo % 60);
    setWindowTitle("考试已用时：" + mintues + "分" + second+ "秒");
}

bool examdialog::hasNoSelect(){
    // 单选做的个数
    int radioSelects = 0;
    // 单选8题
    for (int i = 0; i < 8; ++i) {
        if(m_btnGroups[i]->checkedButton()){
            radioSelects++;
        }
    }
    // 如果选中个数小于8，说明有单选题没做
    if(radioSelects < 8){
        return true;
    }

    // 多选题 - 只选一个也不对
    int checkSelects = 0;
    for (int i = 0; i < 4; ++i) {
        if(m_checkBtns[i]->isChecked()){
            checkSelects++;
        }
    }
    if(checkSelects <= 1){
        return true;
    }

    //判断题 - 都没选说明就没做
    if(!m_radioA->isChecked() && !m_radioB->isChecked()){
        return true;
    }
    return false;
}

void examdialog::getScore(){
    if(hasNoSelect()){
        QMessageBox::information(this, "提示", "别嘚瑟了，还有题没做呢， 好好检查下！！！");
        return;
    }

    // 得分 - 满分100
    int scores = 0;
    for (int i = 0; i < 10; ++i) {
        // 单选题判断
        if(i < 8 && m_btnGroups[i]->checkedButton()->text() == m_answerList.at(i)){
            scores += 10;
        }

        // 多选题得分
        if(i == 8){
            QString answer = m_answerList.at(i);
            bool hasA = false;
            bool hasB = false;
            bool hasC = false;
            bool hasD = false;

            if( answer.contains("A") ) hasA = true;
            if( answer.contains("B") ) hasB = true;
            if( answer.contains("C") ) hasC = true;
            if( answer.contains("D") ) hasD = true;

            bool checkA = m_checkBtns[0]->checkState();
            bool checkB = m_checkBtns[1]->checkState();
            bool checkC = m_checkBtns[2]->checkState();
            bool checkD = m_checkBtns[3]->checkState();

            if( hasA != checkA) continue;
            if( hasB != checkB) continue;
            if( hasC != checkC) continue;
            if( hasD != checkD) continue;

            scores += 10;
        }

        // 判断题得分
        if(i == 9 && m_btnGroups[8]->checkedButton()->text() == m_answerList.at(i)){
            scores += 10;
        }
    }

    QString str = "巨佬，您的得分是：" + QString::number(scores) + "，是否重新考试？";
    int result = QMessageBox::information(this, "提示", str, QMessageBox::Ok | QMessageBox::No);
    if(result == QMessageBox::Ok){
        return;
    }else{
        close();
    }
}
